package pt.isel.lercm.projectmanager.spring.model;

import java.util.Set;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Transient;

@Entity
@Table(name="GRUPO")
public class Grupo {
	
	private int id;
	private String numero;
	private boolean confirmado;
	private String linkGitHub;
	private String linkRedmine;
	private AnoLectivo anoLectivo;
	private Set<Aluno> alunos;
	private GrupoGithub grupoGithub;
	private GrupoRedmine grupoRedmine;
	private Set<Orientador> orientadores;
	
	@Id
	@SequenceGenerator(name="ID_GENERATOR", sequenceName="hibernate_sequence", allocationSize=1)  
	@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="ID_GENERATOR")
	@Column(name="ID", unique = true, nullable = false)
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	
	@Column(name="NUMERO", nullable = true)
	public String getNumero() {
		return numero;
	}
	public void setNumero(String numero) {
		this.numero = numero;
	}
	
	@Column(name="CONFIRMADO", nullable = true)
	public boolean isConfirmado() {
		return confirmado;
	}
	public void setConfirmado(boolean confirmado) {
		this.confirmado = confirmado;
	}
	
	@Column(name="LINK_GITHUB", nullable = true)
	public String getLinkGitHub() {
		return linkGitHub;
	}
	public void setLinkGitHub(String linkGitHub) {
		this.linkGitHub = linkGitHub;
	}
	
	@Column(name="LINK_REDMINE", nullable = true)
	public String getLinkRedmine() {
		return linkRedmine;
	}
	public void setLinkRedmine(String linkRedmine) {
		this.linkRedmine = linkRedmine;
	}
	
	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "ANO_ID")
	public AnoLectivo getAnoLectivo() {
		return anoLectivo;
	}
	public void setAnoLectivo(AnoLectivo anoLectivo) {
		this.anoLectivo = anoLectivo;
	}
	
	@OneToMany(fetch = FetchType.EAGER, mappedBy = "grupo")
	public Set<Aluno> getAlunos(){
		return this.alunos;
	}
	public void setAlunos(Set<Aluno> alunos){
		this.alunos = alunos;
	}
	
	@OneToOne(mappedBy="grupo")  
	public GrupoGithub getGrupoGithub() {
		return grupoGithub;
	}
	public void setGrupoGithub(GrupoGithub grupoGithub) {
		this.grupoGithub = grupoGithub;
	}
	
	@OneToOne(mappedBy="grupo")  
	public GrupoRedmine getGrupoRedmine() {
		return grupoRedmine;
	}
	public void setGrupoRedmine(GrupoRedmine grupoRedmine) {
		this.grupoRedmine = grupoRedmine;
	}
	
	@ManyToMany(fetch = FetchType.EAGER, mappedBy = "grupos")
	public Set<Orientador> getOrientadores() {
		return orientadores;
	}
	public void setOrientadores(Set<Orientador> orientadores) {
		this.orientadores = orientadores;
	}
	
	@Transient
	public Integer getNumAlunos(){
		if (alunos != null && !alunos.isEmpty()){
			return alunos.size();
		}
		
		return  0;
	}
	
	@Transient
	public boolean isNew(){
		return id == 0;
	}
	
	@Transient
	public boolean hasMembers() {
		return alunos != null || alunos.size() > 0;
	}
	
	@Transient
	public boolean equals(Object obj){
		if (obj == null)
            return false;
        if (obj == this)
            return true;
        if (!(obj instanceof Grupo))
            return false;

        Grupo rhs = (Grupo) obj;
        
        return rhs.getId() == this.id;
	}
}
